From c0ba041c73214f82d2c32b2ca1fa8f3c388c6170 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 11 Jun 2018 18:36:50 +0200 Subject: [PATCH] gtk: fix wheel scrolling for very small adjustment page_size For very small page sizes of < 1.0, the effect of pow() is the opposite of what's intended and the scroll steps become unusably large, make sure we never get a scroll_unit larger than page_size / 2.0, which used to be the default before the pow() magic was introduced. --- gtk/gtkrange.c | 12 +++++++++++- gtk/gtkscrolledwindow.c | 6 +++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index dc495631cb..c106102929 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -3061,7 +3061,17 @@ _gtk_range_get_wheel_delta (GtkRange *range, page_increment = gtk_adjustment_get_page_increment (adjustment); if (GTK_IS_SCROLLBAR (range)) - scroll_unit = pow (page_size, 2.0 / 3.0); + { + gdouble pow_unit = pow (page_size, 2.0 / 3.0); + + /* for very small page sizes of < 1.0, the effect of pow() is + * the opposite of what's intended and the scroll steps become + * unusably large, make sure we never get a scroll_unit larger + * than page_size / 2.0, which used to be the default before the + * pow() magic was introduced. + */ + scroll_unit = MIN (pow_unit, page_size / 2.0); + } else scroll_unit = page_increment; diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 8112cfd8e3..b390f9d42e 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -1296,6 +1296,7 @@ get_scroll_unit (GtkScrolledWindow *sw, GtkRange *scrollbar; GtkAdjustment *adj; gdouble page_size; + gdouble pow_unit; if (orientation == GTK_ORIENTATION_HORIZONTAL) scrollbar = GTK_RANGE (priv->hscrollbar); @@ -1307,7 +1308,10 @@ get_scroll_unit (GtkScrolledWindow *sw, adj = gtk_range_get_adjustment (scrollbar); page_size = gtk_adjustment_get_page_size (adj); - scroll_unit = pow (page_size, 2.0 / 3.0); + + /* see comment in _gtk_range_get_wheel_delta() */ + pow_unit = pow (page_size, 2.0 / 3.0); + scroll_unit = MIN (pow_unit, page_size / 2.0); #else scroll_unit = 1; #endif -- 2.30.2